package com.zhupf.doublePoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author zhupf
 * @date 2023年10月25日 16:55
 * @Description.\ 给你一个整数数组 nums ，判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ，同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
 * <p>
 * 你返回所有和为 0 且不重复的三元组。
 */
public class ThreeSum {

    public static void main(String[] args) {
        int[] nums = {3, 0, -2, -1, 1, 2};
        System.out.println(threeSum(nums));

    }

    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums.length < 3) {
            return result;
        }
        Arrays.sort(nums);
        int idxLeft = 0;
        while (idxLeft < nums.length) {
            if (nums[idxLeft] > 0) {
                break;
            }
            int l = idxLeft + 1;
            int r = nums.length - 1;
            while (l < r) {
                int sum = nums[idxLeft] + nums[l] + nums[r];
                if (sum == 0) {
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[idxLeft]);
                    list.add(nums[l]);
                    list.add(nums[r]);
                    result.add(list);

                    while (--r > l && nums[r] == nums[r + 1]) {
                    }

                    while (++l < r && nums[l] == nums[l - 1]) {
                    }

                } else if (sum < 0) {
                    while (++l < r && nums[l] == nums[l - 1]) {
                    }
                } else {
                    while (--r > l && nums[r] == nums[l + 1]) {
                    }
                }

            }
            while (++idxLeft < nums.length && nums[idxLeft - 1] == nums[idxLeft]) {

            }
        }
        return result;
    }

}
